# -*- coding: utf-8 -*-
'''
projecto- classe destinada a leitura da informação no sistema rebides
autor- Jose Jasnau Caeiro
data de criação do módulo- 7/03/2011
observações-

'''

# processamento de HTML através do parser BeautifulSoup
from BeautifulSoup import BeautifulSoup
import re

# biblioteca para acesso através de protocolos de Internet
import urllib2

import sqlite3

from docente import Docente

class Rebides:
    '''
    Rebides
    representação dos dados retirados da base de dados online
    rebides para um determinado ano
    '''
    # url base do sistema Rebides
    URL_REBIDES = 'http://www.rebides.oces.mctes.pt/Rebides'

    # códigos indicativos 
    CODIGO_UNIVERSIDADES_PUBLICAS = '110'
    CODIGO_POLITECNICOS_PUBLICOS  = '120'
    CODIGO_INSTITUICOES_MILITARES = '130'
    CODIGO_UNIVERSIDADES_PRIVADAS = '210'
    CODIGO_POLITECNICOS_PRIVADOS  = '220'

    def gerar_url_ano(self):
        '''
        gerar_url_ano()
        geração 
        '''
        if self.ano < 10:
            self.url_ano = self.URL_REBIDES + '0' + str(self.ano) + '/'
        else:
            self.url_ano = self.URL_REBIDES + str(self.ano) + '/'
            pass
        pass
    
    def gerar_dicionarios_termos(self):
        self.dicionario_codigos = {}

        # universidades públicas
        url_tipo_instituicoes = self.url_ano + \
            'rebid_m1.asp?codr=' + \
            str(self.CODIGO_UNIVERSIDADES_PUBLICAS)

        self.dicionario_codigos[self.CODIGO_UNIVERSIDADES_PUBLICAS] = \
            ('Ensino Superior Público Universitário', 
             url_tipo_instituicoes)

        # politécnicos públicos
        url_tipo_instituicoes = self.url_ano + \
            'rebid_m1.asp?codr=' + \
            str(self.CODIGO_POLITECNICOS_PUBLICOS)

        self.dicionario_codigos[self.CODIGO_POLITECNICOS_PUBLICOS] = \
            ('Ensino Superior Público Politécnico',
             url_tipo_instituicoes)

        # instituições militares
        url_tipo_instituicoes = self.url_ano + \
            'rebid_m1.asp?codr=' + \
            str(self.CODIGO_INSTITUICOES_MILITARES)

        self.dicionario_codigos[self.CODIGO_INSTITUICOES_MILITARES] = \
            ('Ensino Superior Público Militar e Policial',
             url_tipo_instituicoes)

        # universidades privadas
        url_tipo_instituicoes = self.url_ano + \
            'rebid_m1.asp?codr=' + \
            str(self.CODIGO_UNIVERSIDADES_PRIVADAS)

        self.dicionario_codigos[self.CODIGO_UNIVERSIDADES_PRIVADAS] = \
            ('Ensino Superior Privado Universitário',
             url_tipo_instituicoes)

        # politécnicos privados
        url_tipo_instituicoes = self.url_ano + \
            'rebid_m1.asp?codr=' + \
            str(self.CODIGO_POLITECNICOS_PRIVADOS)

        self.dicionario_codigos[self.CODIGO_POLITECNICOS_PRIVADOS] = \
            ('Ensino Superior Privado Politécnico',
             url_tipo_instituicoes)
        
        pass

    def gerar_url_estabelecimento(self,
                                  codigo_tipo_instituicao,
                                  codigo_estabelecimento):
        if self.ano < 10:
            url_estabelecimento = \
                "http://www.rebides.oces.mctes.pt/rebides" + \
                "0" + \
                str(self.ano) + "/rebid_m2.asp?CodR=" + \
                str(codigo_tipo_instituicao) + \
                '&CodP=' + str(codigo_estabelecimento)
        else:
            url_estabelecimento = \
                "http://www.rebides.oces.mctes.pt/rebides" + \
                str(self.ano) + "/rebid_m2.asp?CodR=" + \
                str(codigo_tipo_instituicao) + \
                '&CodP=' + str(codigo_estabelecimento)
        return url_estabelecimento
                                  
    def __init__(self, ano):
        '''
        construtor da classe Rebides(ano)
        '''
        # ano - referencia ao ano a que se vai buscar a informação
        #       da base de dados Rebides
        self.ano = ano
        self.gerar_url_ano()
    
        self.gerar_dicionarios_termos()
        self.buscar_lista_instituicoes()

        codigo_tipo_instituicao = self.CODIGO_POLITECNICOS_PUBLICOS
        codigo_estabelecimento = '3023'
        url_estabelecimento = \
            self.gerar_url_estabelecimento(codigo_tipo_instituicao,
                                           codigo_estabelecimento)

        self.buscar_dados_estabelecimento(url_estabelecimento)
        pass

    def abrir_conexao(self, url):
        '''
        abre a conexão para este url
        '''
        try:
            ficheiro = urllib2.urlopen( url )
            return ficheiro
        except:
            
            print "ERRO ", url
            pass
        pass
    
    def ler_dados(self, ficheiro):
        '''
        ler os dados correspondentes a um ficheiro
        '''
        try:
            dados = ficheiro.read()
            ficheiro.close()
            return dados
        except:
            print "ERRO"
            return
        pass

    def processar_dados_tipos_instituicao(self, dados):
        '''
        '''
        soup = BeautifulSoup(dados)
        lista = []
        
        # print soup.prettify()
        ll = soup.findAll('a')
        for l in ll:
            try:
                newsoup = BeautifulSoup(u"" + unicode(l))
                estabelecimento = newsoup.contents[0].contents[0]
                
                b = newsoup.a
                codigos =  b['href']
                
                m = re.search('(?<=CodP=)\w+', codigos)
                codigo_estabelecimento=m.group(0)
                
                lista.append( (estabelecimento, codigo_estabelecimento))
            except:
                print "ERRO "
                pass
            pass
        return lista

    def contar_numero_instituicoes(self):
        self.dicionario_numero_instituicoes = {}
        for codigo_tipo_instituicao, lista in \
                self.dicionario_instituicoes.iteritems():
            contador = 0
            for x, y in lista:
                contador += 1
                pass
            self.dicionario_numero_instituicoes[codigo_tipo_instituicao] \
                = contador
            pass
        
    def imprimir_numero_instituicoes(self):
        print "Ano: ", self.ano
        for chave, valor in self.dicionario_numero_instituicoes.iteritems():
            print self.dicionario_codigos[chave][0], valor        
            pass
        pass

    def buscar_lista_instituicoes(self):
        '''
        este método permite buscar a lista das instituições de
        ensino superior existentes num determinado ano
        '''
        self.dicionario_instituicoes = {}
        for cod_tipo_instituicao, (tipo_instituicao, url_tipo_instituicao) \
                in self.dicionario_codigos.iteritems():
            ficheiro = self.abrir_conexao(url_tipo_instituicao)
            dados = self.ler_dados(ficheiro)
        
            self.dicionario_instituicoes[ cod_tipo_instituicao ]=\
                self.processar_dados_tipos_instituicao(dados)
            pass
        pass
    
    def buscar_dados_estabelecimento(self, url_estabelecimento):
        '''
        busca os dados dos docentes relativos a cada estabelecimento
        '''
        # abre a conexão para este url
        #print "Conexao aberta: ", url_estabelecimento
        try:
            f = urllib2.urlopen( url_estabelecimento )
        except:
            print "erro: ", url_estabelecimento
            pass

        # lê os dados correspondentes a este estabelecimento de ensino
        try:
            dados = f.read()
            f.close()
        except:
            print "barracada"
            return

        soup = BeautifulSoup(dados)
        contador = 0
        lista = []
        
        # abrir conexao para a base de dados
        conn = sqlite3.connect('rebides.db')
        # criar o cursosr
        cursor = conn.cursor()
        for conteudo_docente in soup('tr'):
            docente = Docente()
            # print "contagem", contador
            # campos = conteudo_docente.find('td', {"class" : "col1"})
            # print campos
            # print campos.find("td", {"class" : "col1"})
            # print conteudo_docente.contents[1].contents[0], contador
            
            # selecciona o nome completo do docente
            nome = conteudo_docente.contents[1].contents[0]
            grau = conteudo_docente.contents[3].contents[0]
            grau = grau.lstrip()
            curso = conteudo_docente.contents[5].contents[0]
            curso = curso.lstrip()
            
            if conteudo_docente.contents[7].contents[0] != u'&nbsp;':
                categoria = conteudo_docente.contents[7].contents[0]
                categoria = categoria.lstrip()

            if conteudo_docente.contents[9].contents[0] != u'&nbsp;':
                regime = conteudo_docente.contents[9].contents[0]
                regime = regime.lstrip()
            
            if nome == u'&nbsp;' :
                grau = conteudo_docente.contents[3].contents[0]
                grau = grau.lstrip()
            else:
                nome_completo = nome
                nome_completo = nome_completo.expandtabs()
                novo_completo = re.sub('\015', '', nome_completo)
                nome_completo = novo_completo.lstrip()
                contador += 1
                pass
            #print grau.encode('utf-8'), nome_completo.encode('utf-8'), \
                curso.encode('utf-8')
            #print categoria.encode('utf-8')
            #print regime.encode('utf-8')

            cmd = '''insert into docente (nome, grau) values ("{0}", "{1}")'''.\
                format(nome_completo.encode('utf-8'), grau.encode('utf-8'))
            #print cmd
            cursor.execute(cmd)
            conn.commit()
            pass
        
        # fecho da conexao
        cursor.close()

        print "Número de docentes: ", contador
        contador = contador + 1
        if contador > 10:
            return lista
        return lista
    pass


#for ano in range(0,10):
#    print "Ano: ", ano
#    rebides = Rebides(ano)


#     rebides.contar_numero_instituicoes()
#     rebides.imprimir_numero_instituicoes()
#     pass


